<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<!--[if lt IE 9]>
  <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
<![endif]-->
<title>VIM 中文帮助: Tcl 接口</title>
<link rel="stylesheet" href="vim-stylesheet.css" type="text/css" />
<link rel="canonical" href="https://yianwillis.github.io/vimcdoc/doc/if_tcl.html" />
<script type="text/javascript" src="vimcdoc.js"></script>
<meta name="viewport" content="width=device-width, initial-scale=1" />
</head>
<body>
<nav id=banner>
<form action=tags.html target="tag_iframe">
  <input type="text" name="tag" id="tag" placeholder="标签搜索">
</form>
<iframe name="tag_iframe" src=""></iframe>
<a href="help.html">帮助总览</a> &middot;
<hr/>
<a href="quickref.html">快速参考</a> &middot;
<a href="index.html">命令索引</a> &middot;
<a href="eval.html#functions">函数列表</a> &middot;
<a href="quickref.html#option-list">选项列表</a> &middot;
<hr/>
<a href="usr_toc.html">用户手册</a> &middot;
<a href="help.html#reference_toc">参考手册</a> &middot;
</nav>

<header>
<h2>if_tcl</h2>
</header>
<article id=outer>
<section class=inner>
<b class="vimtag"> <a name="if_tcl.txt">if_tcl.txt</a> </b>    适用于 Vim 9.0 版本。   最近更新: 2022年7月


                  <code class="vim">VIM 参考手册    by Ingo Wilken</code>
                                <code class="vim">译者</code>: Willis


Vim 的 Tcl 接口                         <b class="vimtag"> <a name="tcl">tcl</a> </b> <b class="vimtag"> <a name="Tcl">Tcl</a> </b> <b class="vimtag"> <a name="TCL">TCL</a> </b>

1. 命令                                  <a href="if_tcl.html#tcl-ex-commands">tcl-ex-commands</a> 
2. Tcl 命令                              <a href="if_tcl.html#tcl-commands">tcl-commands</a> 
3. Tcl 变量                              <a href="if_tcl.html#tcl-variables">tcl-variables</a> 
4. Tcl 窗口命令                          <a href="if_tcl.html#tcl-window-cmds">tcl-window-cmds</a> 
5. Tcl 缓冲区命令                        <a href="if_tcl.html#tcl-buffer-cmds">tcl-buffer-cmds</a> 
6. 杂项；Tcl 的输出                      <a href="if_tcl.html#tcl-misc">tcl-misc</a>   <a href="if_tcl.html#tcl-output">tcl-output</a> 
7. 已知漏洞和问题                        <a href="if_tcl.html#tcl-bugs">tcl-bugs</a> 
8. 示例                                  <a href="if_tcl.html#tcl-examples">tcl-examples</a> 
9. 动态调入                              <a href="if_tcl.html#tcl-dynamic">tcl-dynamic</a> 

<code class="notvi">{仅当 Vim 编译时加入  <a href="various.html#+tcl">+tcl</a>  特性时才有效}</code>

                                                        <b class="vimtag"> <a name="E280">E280</a> </b>
<code class="note">警告</code>: 可能还有没发现的漏洞。请把漏洞报告、意见、建议等等发送到
&lt;Ingo.Wilken@informatik.uni-oldenburg.de&gt;

</section><hr class="doubleline" /><section class=inner>
<h4>1. 命令                                 <b class="vimtag"> <a name="tcl-ex-commands">tcl-ex-commands</a> </b> <b class="vimtag"> <a name="E571">E571</a> </b> <b class="vimtag"> <a name="E572">E572</a> </b></h4>
                                                        <b class="vimtag"> <a name=":tcl">:tcl</a> </b>
:tcl <code class="special">{cmd}</code>              执行 Tcl 命令 <code class="special">{cmd}</code>。测试  <a href="if_tcl.html#:tcl">:tcl</a>  是否可用的简单检查: 
<code class="example">                                :tcl puts "Hello"</code>
<code class="example"></code>
:<code class="special">[range]</code>tcl &lt;&lt; <code class="special">[trim]</code> [<code class="special">{endmarker}</code>]
<code class="special">{script}</code>
<code class="special">{endmarker}</code>
                        执行 Tcl 脚本 <code class="special">{script}</code>。
                        <code class="note">注意</code>: 如果编译时没有加入 Tcl 特性，该命令不会工作。要
                        避免错误，参见  <a href="if_perl.html#script-here">script-here</a> 。

若 "&lt;&lt;" 之后省略 <code class="special">[endmarker]</code>，<code class="special">{script}</code> 之后必须有一个点号 '.'，就像  <a href="insert.html#:append">:append</a> 
和  <a href="insert.html#:insert">:insert</a>  命令那样。更多详情可见  <a href="eval.html#:let-heredoc">:let-heredoc</a> 。

这种形式的  <a href="if_tcl.html#:tcl">:tcl</a>  命令主要用于在 Vim 脚本里包含 tcl 代码。

示例: 
<code class="example">        function! DefineDate()</code>
<code class="example">            tcl &lt;&lt; EOF</code>
<code class="example">            proc date {} {</code>
<code class="example">                return [clock format [clock seconds]]</code>
<code class="example">            }</code>
<code class="example">        EOF</code>
<code class="example">        endfunction</code>

要看运行的 Tcl 版本: 
<code class="example">        :tcl puts [info patchlevel]</code>


                                                        <b class="vimtag"> <a name=":tcldo">:tcldo</a> </b> <b class="vimtag"> <a name=":tcld">:tcld</a> </b>
:<code class="special">[range]</code>tcld[o] <code class="special">{cmd}</code>   对 <code class="special">[range]</code> 范围内的每行执行 Tcl 命令 <code class="special">{cmd}</code>。执行过程
                        中，变量 "line" 被赋值为每行的文本，"lnum" 为相应的行
                        号。改变 "line" 会改变文本，但是你不能用此命令增加或者
                        删除行。如果 <code class="special">{cmd}</code> 有错，整个命令被中断。缺省的范围
                        <code class="special">[range]</code> 是整个文件，"1,$"。参见  <a href="if_tcl.html#tcl-var-line">tcl-var-line</a>  和
                         <a href="if_tcl.html#tcl-var-lnum">tcl-var-lnum</a> 。

                                                        <b class="vimtag"> <a name=":tclfile">:tclfile</a> </b> <b class="vimtag"> <a name=":tclf">:tclf</a> </b>
:tclf[ile] <code class="special">{file}</code>       执行 Tcl 脚本文件 <code class="special">{file}</code>。它和 ":tcl source <code class="special">{file}</code>" 相
                        当，但可用文件名自动补全功能。


<code class="note">注意</code> Tcl 对象 (类似于变量) 在命令之间保持值不变。就像在 Tcl 外壳里使用那样。

 <a href="eval.html#sandbox">sandbox</a>  里不能执行 Tcl 命令。

</section><hr class="doubleline" /><section class=inner>
<h4>2. Tcl 命令                                             <b class="vimtag"> <a name="tcl-commands">tcl-commands</a> </b></h4>
Tcl 完全通过 "::vim" 命名空间的命令访问 vim 的功能。已实现以下功能: 
<code class="example"></code>
<code class="example">        ::vim::beep                     # 猜猜看。</code>
<code class="example">        ::vim::buffer {n}               # 为单个缓冲区建立 Tcl 命令。</code>
<code class="example">        ::vim::buffer list              # 为所有缓冲区建立 Tcl 命令。</code>
<code class="example">        ::vim::command [-quiet] {cmd}   # 执行 Ex 命令。</code>
<code class="example">        ::vim::expr {expr}              # 使用 Vim 的表达式计算器。</code>
<code class="example">        ::vim::option {opt}             # 得到 vim 选项值。</code>
<code class="example">        ::vim::option {opt} {val}       # 设置 vim 选项值。</code>
<code class="example">        ::vim::window list              # 为所有窗口建立 Tcl 命令。</code>
<code class="example"></code>
命令:
        ::vim::beep                                     <b class="vimtag"> <a name="tcl-beep">tcl-beep</a> </b>
        鸣笛。没有返回值。

        ::vim::buffer <code class="special">{n}</code>                               <b class="vimtag"> <a name="tcl-buffer">tcl-buffer</a> </b>
        ::vim::buffer exists <code class="special">{n}</code>
        ::vim::buffer list
        提供对 vim 缓冲区的访问。如果给出整数参数，为相应的缓冲区建立缓冲区命
        令 (参见  <a href="if_tcl.html#tcl-buffer-cmds">tcl-buffer-cmds</a> )，并返回其名称作为结果。非法的缓冲区号会产
        生标准 Tcl 错误。要测试哪些缓冲区号合法，可用 Vim 的内部函数: 
<code class="example">                set nbufs [::vim::expr bufnr("$")]</code>
<code class="example">                set isvalid [::vim::expr "bufexists($n)"]</code>
        "list" 选项则为每个合法的缓冲区建立缓冲区命令，并返回所有命令名称的列
        表作为结果。例如: 
<code class="example">                set bufs [::vim::buffer list]</code>
<code class="example">                foreach b $bufs { $b append end "The End!" }</code>
        "exists" 选项检查给定序号的缓冲区是否存在。例如: 
<code class="example">                if { [::vim::buffer exists $n] } { ::vim::command ":e #$n" }</code>
        该命令将来也许会被某个变量代替。要得到当前缓冲区，另见
         <a href="if_tcl.html#tcl-var-current">tcl-var-current</a> 。

        ::vim::command <code class="special">{cmd}</code>                            <b class="vimtag"> <a name="tcl-command">tcl-command</a> </b>
        ::vim::command -quiet <code class="special">{cmd}</code>
        执行 vim (ex 模式) 的 <code class="special">{cmd}</code> 命令。任何涉及缓冲区或者窗口的 Ex 命令均
        使用当前缓冲区/窗口。除了标准的 Tcl 错误代码外，不会返回任何其他的结
        果。在命令执行完毕后，"::vim::current" 变量被更新。
        "-quiet" 标志位屏蔽 vim 产生的任何错误信息。
        例如: 
<code class="example">                ::vim::command "set ts=8"</code>
<code class="example">                ::vim::command "%s/foo/bar/g"</code>
        要执行普通模式下的命令，使用 "normal" (参见  <a href="various.html#:normal">:normal</a> ): 
<code class="example">                set cmd "jj"</code>
<code class="example">                ::vim::command "normal $cmd"</code>
        另见  <a href="if_tcl.html#tcl-window-command">tcl-window-command</a>  和  <a href="if_tcl.html#tcl-buffer-command">tcl-buffer-command</a> 。

        ::vim::expr <code class="special">{expr}</code>                              <b class="vimtag"> <a name="tcl-expr">tcl-expr</a> </b>
        使用 vim 的内部表达式计算器计算表达式 <code class="special">{expr}</code> (参见  <a href="eval.html#expression">expression</a> )。任何
        查询缓冲区或窗口属性的表达式均使用当前缓冲区/窗口。结果以字符串形式返
        回。列表  <a href="eval.html#List">List</a>  通过连接项目并在项目间插入换行符来转化为字符串。
        例如: 
<code class="example">                set perl_available [::vim::expr has("perl")]</code>
        另见  <a href="if_tcl.html#tcl-window-expr">tcl-window-expr</a>  和  <a href="if_tcl.html#tcl-buffer-expr">tcl-buffer-expr</a> 。

        ::vim::option <code class="special">{opt}</code>                             <b class="vimtag"> <a name="tcl-option">tcl-option</a> </b>
        ::vim::option <code class="special">{opt}</code> <code class="special">{value}</code>
        如果没有第二个参数，查询 vim 选项之值。不然，设置 vim 选项值为
        <code class="special">{value}</code>，并返回原先的值作为结果。任何标为 "局部于缓冲区" 或 "局部于窗
        口" 的选项只影响当前的缓冲区/窗口。该命令不会改变全局值，而应该用
        ":set" 命令。对于布尔值，<code class="special">{value}</code> 必须是 "0" 或者 "1"，或者以下的关键字
        "on"、"off" 或者 "toggle"。选项列表请参见  <a href="options.html#option-summary">option-summary</a> 。
        示例: 
<code class="example">                ::vim::option ts 8</code>
        另见  <a href="if_tcl.html#tcl-window-option">tcl-window-option</a>  和  <a href="if_tcl.html#tcl-buffer-option">tcl-buffer-option</a> 。

        ::vim::window <code class="special">{option}</code>                          <b class="vimtag"> <a name="tcl-window">tcl-window</a> </b>
        提供对 vim 窗口的访问。目前，只实现了 "list" 选项，即为每个窗口建立窗
        口命令 (参见  <a href="if_tcl.html#tcl-window-cmds">tcl-window-cmds</a> )，并返回所有命令名称的列表作为结果。
        示例: 
<code class="example">                set wins [::vim::window list]</code>
<code class="example">                foreach w $wins { $w height 4 }</code>
        该命令将来也许会被某个变量代替。要得到当前窗口，另见
         <a href="if_tcl.html#tcl-var-current">tcl-var-current</a> 。

</section><hr class="doubleline" /><section class=inner>
<h4>3. Tcl 变量                                             <b class="vimtag"> <a name="tcl-variables">tcl-variables</a> </b></h4>
::vim 命名空间包含若干变量。Tcl 解释器调用时，它们被建立并赋予它们的当前值。 
<code class="example"></code>
<code class="example">        ::vim::current          # "当前" 对象的数组</code>
<code class="example">        ::vim::lbase            # 第一行的行号</code>
<code class="example">        ::vim::range            # 当前范围行号的数组</code>
<code class="example">        line                    # 当前行号的字符串表示 (只限于 :tcldo)</code>
<code class="example">        lnum                    # 当前行号 (只限于 :tcldo)</code>
<code class="example"></code>
命令:
        ::vim::current                                  <b class="vimtag"> <a name="tcl-var-current">tcl-var-current</a> </b>
        这是一个提供对各种 vim "当前" 对象访问的数组。每次 "::vim::command" 执
        行后都会更新该数组的内容，因为命令的执行可能改变 vim 的当前设定 (例
        如，删除当前缓冲区)。
        其中，"buffer" 元素包含当前缓冲区的缓冲区命令名，可用来直接调用缓冲区
        命令 (参见  <a href="if_tcl.html#tcl-buffer-cmds">tcl-buffer-cmds</a> )。该元素只读。
        示例: 
<code class="example">                $::vim::current(buffer) insert begin "Hello world"</code>
        "window" 元素则包含当前窗口的窗口命令名。可用来直接调用窗口命令 (参见
         <a href="if_tcl.html#tcl-window-cmds">tcl-window-cmds</a> )。该元素只读。
        示例: 
<code class="example">                $::vim::current(window) height 10</code>

        ::vim::lbase                                    <b class="vimtag"> <a name="tcl-var-lbase">tcl-var-lbase</a> </b>
        该变量控制 Tcl 如何看待行号。如果设为 '1'，行号与列号从 1 开始。这样，
        Tcl 命令和 vim 表达式行号的使用方式一致。如果设为 '0'，则行号与列号从
        0 开始。如果你倾向于把缓冲区看成 Tcl 的列表或者把行看成 Tcl 字符串，
        那么 Tcl 中标准的返回索引的命令 (例如 "lsort" 或 "string first") 就适
        用于这种设置。缺省值为 '1'。目前，任何非零的值都被看成 '1'，但你的脚本
        不应依赖于此假定。另见  <a href="if_tcl.html#tcl-linenumbers">tcl-linenumbers</a> 。

        ::vim::range                                    <b class="vimtag"> <a name="tcl-var-range">tcl-var-range</a> </b>
        这是一个由三个元素组成的数组: "start"、"begin" 和 "end"。它包含当前行
        范围的起始和结尾行号。"begin" 等价于 "start"。该变量只读。参见
         <a href="if_tcl.html#tcl-examples">tcl-examples</a> 。

        line                                            <b class="vimtag"> <a name="tcl-var-line">tcl-var-line</a> </b>
        lnum                                            <b class="vimtag"> <a name="tcl-var-lnum">tcl-var-lnum</a> </b>
        这些全局变量只在 ":tcldo" 这个 Ex 命令执行时可用。 它们分别包含文本和
        数字形式的当前行号。当 ":tcldo" 激活的 Tcl 命令执行完毕时，当前行被设
        为 "line" 变量的内容，除非该变量被 Tcl 命令删除 (unset)。"lnum" 变量是
        只读的。这些变量不在 "::vim" 命名空间里，这是为了 ":tcldo" 里使用时能
        减少点输入 (将来的版本里可能会改变)。 另见  <a href="if_tcl.html#tcl-linenumbers">tcl-linenumbers</a> 。

</section><hr class="doubleline" /><section class=inner>
<h4>4. Tcl 窗口命令                                         <b class="vimtag"> <a name="tcl-window-cmds">tcl-window-cmds</a> </b></h4>
窗口命令代表 vim 的窗口。以下若干命令可以创建之:
        ::vim::window list                       <a href="if_tcl.html#tcl-window">tcl-window</a> 
        缓冲区命令的 "windows" 选项              <a href="if_tcl.html#tcl-buffer-windows">tcl-buffer-windows</a> 
::vim::current(window) 变量包含当前窗口的窗口命令名。当 vim 窗口关闭时， 对应
的窗口命令自动被删除。

让我们假设窗口命令名保存在 Tcl 变量 "win" 中，亦即，$win 调用该命令。那么可以
使用以下的选项: 
<code class="example"></code>
<code class="example">        $win buffer             # 创建窗口对应缓冲区的 Tcl 命令。</code>
<code class="example">        $win command {cmd}      # 使用窗口的上下文，执行 Ex 命令。</code>
<code class="example">        $win cursor             # 得到当前的光标位置。</code>
<code class="example">        $win cursor {var}       # 把光标位置保存在数组变量里。</code>
<code class="example">        $win cursor {row} {col} # 设置光标位置。</code>
<code class="example">        $win delcmd {cmd}       # 在窗口被关闭前，执行 Tcl 命令。</code>
<code class="example">        $win expr {expr}        # 使用窗口的上下文，计算 vim 表达式。</code>
<code class="example">        $win height             # 报告窗口的高度。</code>
<code class="example">        $win height {n}         # 设置窗口的高度。</code>
<code class="example">        $win option {opt} [val] # 使用窗口的上下文，得到/设置 vim 选项。</code>
<code class="example"></code>
选项:
        $win buffer                                     <b class="vimtag"> <a name="tcl-window-buffer">tcl-window-buffer</a> </b>
        创建窗口对应缓冲区的 Tcl 命令，并返回其名字作为结果。该名字应该被存在
        变量里: 
<code class="example">                set buf [$win buffer]</code>
        $buf 现在成为合法的 Tcl 命令。参见  <a href="if_tcl.html#tcl-buffer-cmds">tcl-buffer-cmds</a>  了解其可用选项。

        $win cursor                                     <b class="vimtag"> <a name="tcl-window-cursor">tcl-window-cursor</a> </b>
        $win cursor <code class="special">{var}</code>
        $win cursor <code class="special">{row}</code> <code class="special">{col}</code>
        在没有参数的情况下，报告 (字符串形式的) 当前的光标位置。该形式可以被转
        换成 Tcl 的数组变量: 
<code class="example">                array set here [$win cursor]</code>
        "here(row)" 和 "here(column)" 现在包含了光标位置。
        在有一个参数的情况下，该参数被解释为 Tcl 数组变量名，该数组变量应该有
        两个元素: "row" 和 "column"。它们用来设置光标的新位置: 
<code class="example">                $win cursor here        ;# 不是 $here !</code>
        在有两个参数的情况下，设置光标到对应的行和列: 
<code class="example">                $win cursor $here(row) $here(column)</code>
        非法的位置产生标准 Tcl 错误，但可用 "catch" 捕获。行号和列号的值和
        "::vim::lbase" 有关。参见  <a href="if_tcl.html#tcl-var-lbase">tcl-var-lbase</a> 。

        $win delcmd <code class="special">{cmd}</code>                               <b class="vimtag"> <a name="tcl-window-delcmd">tcl-window-delcmd</a> </b>
        注册窗口的关闭回调函数 <code class="special">{cmd}</code>。该命令 (在全局范围下) 在窗口被关闭前调
        用。复杂的命令应该用 "list" 构造: 
<code class="example">                $win delcmd [list puts vimerr "window deleted"]</code>
        另见  <a href="if_tcl.html#tcl-buffer-delcmd">tcl-buffer-delcmd</a> 。

        $win height                                     <b class="vimtag"> <a name="tcl-window-height">tcl-window-height</a> </b>
        $win height <code class="special">{n}</code>
        在没有参数的情况下，报告当前的窗口高度。在有参数的情况下，设置窗口高度
为 <code class="special">{n}</code>，并报告新的高度 (有可能和 <code class="special">{n}</code> 不同)。

        $win command [-quiet] <code class="special">{cmd}</code>                     <b class="vimtag"> <a name="tcl-window-command">tcl-window-command</a> </b>
        $win expr <code class="special">{expr}</code>                                <b class="vimtag"> <a name="tcl-window-expr">tcl-window-expr</a> </b>
        $win option <code class="special">{opt}</code> <code class="special">[val]</code>                         <b class="vimtag"> <a name="tcl-window-option">tcl-window-option</a> </b>
        它们和 "::vim::command" 类似，只不过执行在 $win 代表的窗口的上下文下，
        而不是当前窗口。例如，设置 "局部于窗口" 的选项涉及的是 $win 窗口。任何
        涉及或查询缓冲区的命令使用的该窗口所显示的缓冲区 (亦即，"$win buffer"
        所指定的缓冲区)。参见  <a href="if_tcl.html#tcl-command">tcl-command</a> 、 <a href="if_tcl.html#tcl-expr">tcl-expr</a>  和  <a href="if_tcl.html#tcl-option">tcl-option</a> 。
        示例: 
<code class="example">                $win option number on</code>
<code class="example"></code>
</section><hr class="doubleline" /><section class=inner>
<h4>5. Tcl 缓冲区命令                                       <b class="vimtag"> <a name="tcl-buffer-cmds">tcl-buffer-cmds</a> </b></h4>
缓冲区命令代表 vim 的缓冲区。以下若干命令可以创建之:
        ::vim::buffer <code class="special">{N}</code>                        <a href="if_tcl.html#tcl-buffer">tcl-buffer</a> 
        ::vim::buffer list                       <a href="if_tcl.html#tcl-buffer">tcl-buffer</a> 
        "buffer" option of a window command      <a href="if_tcl.html#tcl-window-buffer">tcl-window-buffer</a> 
::vim::current(buffer) 变量包含当前缓冲区的缓冲区命令名。vim 缓冲区被删除时，
对应的缓冲区命令自动被删除。缓冲区一旦改变，缓冲区里的所有的位置标记会进行自动
调整。Tcl 命令对缓冲区内容所做的任何改变都可以通过 vim 的 "undo" 命令撤销 (参
见  <a href="undo.html#undo">undo</a> )。

让我们假设缓冲区命令名保存在 Tcl 变量 "buf" 中，亦即，$buf 调用该命令。那么可
以使用以下的选项: 
<code class="example"></code>
<code class="example">        $buf append {n} {str}   # 在缓冲区的第 {n} 行之后添加一行内容。</code>
<code class="example">        $buf command {cmd}      # 使用缓冲区上下文。执行 Ex 命令。</code>
<code class="example">        $buf count              # 报告缓冲区的行数。</code>
<code class="example">        $buf delcmd {cmd}       # 在缓冲区被删除前，执行 Tcl 命令。</code>
<code class="example">        $buf delete {n}         # 删除一行。</code>
<code class="example">        $buf delete {n} {m}     # 删除多行。</code>
<code class="example">        $buf expr {expr}        # 使用窗口的上下文，计算 vim 表达式。</code>
<code class="example">        $buf get {n}            # 得到字符串形式的一行内容。</code>
<code class="example">        $buf get {n} {m}        # 得到列表形式的多行内容。</code>
<code class="example">        $buf insert {n} {str}   # 在缓冲区里插入一行，使之成为第 {n} 行。</code>
<code class="example">        $buf last               # 报告缓冲区末行的行号。</code>
<code class="example">        $buf mark {mark}        # 报告缓冲区位置标记的位置。</code>
<code class="example">        $buf name               # 报告缓冲区使用的文件名。</code>
<code class="example">        $buf number             # 报告缓冲区号。</code>
<code class="example">        $buf option {opt} [val] # 使用缓冲区的上下文，得到/设置 vim 选项。</code>
<code class="example">        $buf set {n} {text}     # 替换一行。</code>
<code class="example">        $buf set {n} {m} {list} # 替换多行。</code>
<code class="example">        $buf windows            # 创建缓冲区对应窗口的 Tcl 命令。</code>

                                                        <b class="vimtag"> <a name="tcl-linenumbers">tcl-linenumbers</a> </b>
多数缓冲区命令需要行号作为参数。Tcl 如何处理这些数字取决于 "::vim::lbase" 变量
(参见  <a href="if_tcl.html#tcl-var-lbase">tcl-var-lbase</a> )。除了数字形式的行号以外，还可以使用如下的关键字:
"top"、"start"、"begin"、"first" (以上均代表首行)，"bottom"、"end" 和 "last"
(以上均代表末行)。

选项:
        $buf append <code class="special">{n}</code> <code class="special">{str}</code>                           <b class="vimtag"> <a name="tcl-buffer-append">tcl-buffer-append</a> </b>
        $buf insert <code class="special">{n}</code> <code class="special">{str}</code>                           <b class="vimtag"> <a name="tcl-buffer-insert">tcl-buffer-insert</a> </b>
        往缓冲区中加入一行。如果使用 "insert" 选项，字符串成为新的第 <code class="special">{n}</code> 行。
        而如果使用 "append"，它被插入在第 <code class="special">{n}</code> 行之后。
        例如: 
<code class="example">                $buf insert top "This is the beginning."</code>
<code class="example">                $buf append end "This is the end."</code>
        要往缓冲区里加入多行，可以使用循环: 
<code class="example">                foreach line $list { $buf append $num $line ; incr num }</code>

        $buf count                                      <b class="vimtag"> <a name="tcl-buffer-count">tcl-buffer-count</a> </b>
        报告缓冲区的行数。

        $buf delcmd <code class="special">{cmd}</code>                               <b class="vimtag"> <a name="tcl-buffer-delcmd">tcl-buffer-delcmd</a> </b>
        注册缓冲区的删除回调函数 <code class="special">{cmd}</code>。该命令 (在全局范围下) 在缓冲区被删除前
        调用。复杂的命令应该用 "list" 构造: 
<code class="example">                $buf delcmd [list puts vimerr "buffer [$buf number] gone"]</code>
        另见  <a href="if_tcl.html#tcl-window-delcmd">tcl-window-delcmd</a> 。

        $buf delete <code class="special">{n}</code>                                 <b class="vimtag"> <a name="tcl-buffer-delete">tcl-buffer-delete</a> </b>
        $buf delete <code class="special">{n}</code> <code class="special">{m}</code>
        删除缓冲区的第 <code class="special">{n}</code> 行或者第 <code class="special">{n}</code> 到 <code class="special">{m}</code> 行。以下例子删除除了末行以外的
        所有内容: 
<code class="example">                $buf delete first [expr [$buf last] - 1]</code>

        $buf get <code class="special">{n}</code>                                    <b class="vimtag"> <a name="tcl-buffer-get">tcl-buffer-get</a> </b>
        $buf get <code class="special">{n}</code> <code class="special">{m}</code>
        从缓冲区里取得一行或多行。如果是前者，结果是字符串。如果是后者，结果是
        字符串列表。例如: 
<code class="example">                set topline [$buf get top]</code>

        $buf last                                       <b class="vimtag"> <a name="tcl-buffer-last">tcl-buffer-last</a> </b>
        报告末行的行号。行号和 "::vim::lbase" 有关。参见  <a href="if_tcl.html#tcl-var-lbase">tcl-var-lbase</a> 。

        $buf mark <code class="special">{mark}</code>                                <b class="vimtag"> <a name="tcl-buffer-mark">tcl-buffer-mark</a> </b>
        报告命名位置标记的位置。结果以字符串形式出现，类似于窗口命令的
        "cursor" 选项的光标位置 (参见  <a href="if_tcl.html#tcl-window-cursor">tcl-window-cursor</a> )。它可以被转换成 Tcl
        数组变量: 
<code class="example">                array set mpos [$buf mark "a"]</code>
        "mpos(column)" 和 "mpos(row)" 现在包含了标记的位置。如果标记没有设置，
        产生标准 Tcl 错误。

        $buf name
        报告缓冲区使用的文件名。如果是无名缓冲区，返回空字符串。

        $buf number
        报告缓冲区号。参见  <a href="windows.html#:buffers">:buffers</a> 。
        以下示例从 vim 里删除一个缓冲区: 
<code class="example">                ::vim::command "bdelete [$buf number]"</code>

        $buf set <code class="special">{n}</code> <code class="special">{string}</code>                           <b class="vimtag"> <a name="tcl-buffer-set">tcl-buffer-set</a> </b>
        $buf set <code class="special">{n}</code> <code class="special">{m}</code> <code class="special">{list}</code>
        替换缓冲区里的一行或多行。如果列表 <code class="special">{list}</code> 里包含超过被替换的行数，多余
        的部分被插入。如果不足，则未替换的部分从缓冲区里删除。

        $buf windows                                    <b class="vimtag"> <a name="tcl-buffer-windows">tcl-buffer-windows</a> </b>
        创建缓冲区对应的所有的窗口命令，返回所有命令名字的列表。
        示例: 
<code class="example">                set winlist [$buf windows]</code>
<code class="example">                foreach win $winlist { $win height 4 }</code>
        参见  <a href="if_tcl.html#tcl-window-cmds">tcl-window-cmds</a>  了解窗口命令可用的选项。

        $buf command [-quiet] <code class="special">{cmd}</code>                     <b class="vimtag"> <a name="tcl-buffer-command">tcl-buffer-command</a> </b>
        $buf expr <code class="special">{expr}</code>                                <b class="vimtag"> <a name="tcl-buffer-expr">tcl-buffer-expr</a> </b>
        $buf option <code class="special">{opt}</code> <code class="special">[val]</code>                         <b class="vimtag"> <a name="tcl-buffer-option">tcl-buffer-option</a> </b>
        它们和 "::vim::command" 类似，只不过执行在 $buf 代表的缓冲区的上下文
        下， 而不是当前缓冲区。例如，设置 "局部于缓冲区" 的选项涉及的是 $buf
        缓冲区。任何涉及或查询窗口的命令使用的该缓冲区所处的窗口列表的第一个窗
        口 (亦即，"$buf windows" 所指定的首个窗口)。参见  <a href="if_tcl.html#tcl-command">tcl-command</a> 、
         <a href="if_tcl.html#tcl-expr">tcl-expr</a>  和  <a href="if_tcl.html#tcl-option">tcl-option</a> 。
        示例: 
<code class="example">                if { [$buf option modified] } { $buf command "w" }</code>
<code class="example"></code>
</section><hr class="doubleline" /><section class=inner>
<h4>6. 杂项；Tcl 的输出                             <b class="vimtag"> <a name="tcl-misc">tcl-misc</a> </b> <b class="vimtag"> <a name="tcl-output">tcl-output</a> </b></h4>
标准 Tcl 命令 "exit" 和 "catch" 被定制的版本所取代。"exit" 终止当前 Tcl 脚本并
返回 vim，并关闭 Tcl 解释器。 下一个 ":tcl" 的调用相应的创建一个新的 Tcl 解释
器。"exit" 并 <code class="emphasis">不</code> 终止 vim！"catch" 和原先的工作方式相同，只不过，它不能防止脚
本从 "exit" 退出。退出时，非零的结束代码使得执行 Tcl 脚本的 Ex 命令生成一个错
误。

在 Tcl 里，有两个新的 I/O 流: "vimout" 和 "vimerr"。所有其上的输出都在 vim 的
消息区域分别作为消息和错误显示。标准的 Tcl 输出流 stdout 和 stderr 被映射为
vimout 和 vimerr。从而，正常的 "puts" 命令可以用来在 vim 里显示消息。

</section><hr class="doubleline" /><section class=inner>
<h4>7. 已知的漏洞和问题                                     <b class="vimtag"> <a name="tcl-bugs">tcl-bugs</a> </b></h4>
在 Tcl 里调用另一个 Tcl 的 Ex 命令 (通过 "::vim::command") 可能有意想不到的副
作用。该命令创建的新的解释器和标准的解释器的能力相同。因而，在安全的子解释器里
使得 "::vim::command" 可用使得该子解释器不再安全。(为了防止这一点而防止嵌套的
:tcl* 调用很容易，但不切实际。因为根据具体的 vim 的配置，"::vim::command" 可以
在任何其他的脚本语言里执行任何代码。) 在这个新的解释器里 "exit" 不会影响旧的解
释器；它只会终止新的解释器，而旧解释器的脚本处理继续进行。

现在还不支持从标准输入读入。

</section><hr class="doubleline" /><section class=inner>
<h4>8. 示例:                                                <b class="vimtag"> <a name="tcl-examples">tcl-examples</a> </b></h4>
这里提供若干简短 (但可能有用) 的 Tcl 脚本。

此脚本对整个缓冲区进行排序 (不妨假设缓冲区内容包含名字或类似事物的列表): 
<code class="example">        set buf $::vim::current(buffer)</code>
<code class="example">        set lines [$buf get top bottom]</code>
<code class="example">        set lines [lsort -dictionary $lines]</code>
<code class="example">        $buf set top bottom $lines</code>
<code class="example"></code>
此脚本对缓冲区的行进行倒排。<code class="note">注意</code> "::vim::lbase" 和 "$buf last" 的正确使用，以
适用行号的所有可能情况。 
<code class="example">        set buf $::vim::current(buffer)</code>
<code class="example">        set t $::vim::lbase</code>
<code class="example">        set b [$buf last]</code>
<code class="example">        while { $t &lt; $b } {</code>
<code class="example">                set tl [$buf get $t]</code>
<code class="example">                set bl [$buf get $b]</code>
<code class="example">                $buf set $t $bl</code>
<code class="example">                $buf set $b $tl</code>
<code class="example">                incr t</code>
<code class="example">                incr b -1</code>
<code class="example">        }</code>
<code class="example"></code>
此脚本为当前范围的每行加上连续的行号: 
<code class="example">        set buf $::vim::current(buffer)</code>
<code class="example">        set i $::vim::range(start)</code>
<code class="example">        set n 1</code>
<code class="example">        while { $i &lt;= $::vim::range(end) } {</code>
<code class="example">                set line [$buf get $i]</code>
<code class="example">                $buf set $i "$n\t$line"</code>
<code class="example">                incr i ; incr n</code>
<code class="example">        }</code>
<code class="example"></code>
用 ":tcldo" 可以更快地以两个 Ex 命令完成同样的工作: 
<code class="example">        :tcl set n 1</code>
<code class="example">        :[range]tcldo set line "$n\t$line" ; incr n</code>
<code class="example"></code>
此过程为每个缓冲区执行相同的 Ex 命令 (从 Ron Aaron 偷来的主意): 
<code class="example">        proc eachbuf { cmd } {</code>
<code class="example">                foreach b [::vim::buffer list] {</code>
<code class="example">                        $b command $cmd</code>
<code class="example">                }</code>
<code class="example">        }</code>
使用方法为: 
<code class="example">        :tcl eachbuf %s/foo/bar/g</code>
小心使用 Tcl 的字符串和反斜杠替换，很麻烦。如果不确定，不妨在 Ex 命令前后括上
花括号。


如果你想为 vim 永久地加入若干 Tcl 过程，只要把它们放在一个文件里 (例如在 Unix
机器上，"~/.vimrc.tcl")，并在启动文件里 (在 Unix 上通常是 "~/.vimrc") 加入: 
<code class="example">        if has("tcl")</code>
<code class="example">                tclfile ~/.vimrc.tcl</code>
<code class="example">        endif</code>
<code class="example"></code>
</section><hr class="doubleline" /><section class=inner>
<h4>9. 动态调入                                             <b class="vimtag"> <a name="tcl-dynamic">tcl-dynamic</a> </b></h4>
MS-Windows 和 Unix 上，可以动态调入 Tcl 库。 <a href="various.html#:version">:version</a>  输出这时应包括
 <a href="various.html#+tcl%2Fdyn">+tcl/dyn</a> 。

这意味着 Vim 只有在必要时才寻找 Tcl DLL 或共享库文件。如果不使用 Tcl 接口，你
就不需要它。这样，即使没有该文件，你也可使用 Vim。


<code class="section">MS-Windows </code>

要使用 Tcl 接口，Tcl DLL 必须在搜索路径上。控制台窗口里输入 "path" 可以看到
(搜索路径) 当前使用的目录。也可用 <a href="options.html#'tcldll'">'tcldll'</a> 选项指定 Tcl DLL。

DLL 的名字必须匹配 Vim 编译时所使用的 Tcl 版本。目前，该名字为 "tcl86.dll"，也
就是 Tcl 8.6。要确信这一点，编辑 "gvim.exe" 文件并查找 "tcl\d*.dll\c"。


<code class="section">Unix </code>

<a href="options.html#'tcldll'">'tcldll'</a> 选项可用来指定 Tcl 共享库文件，而不用编译时指定的 DYNAMIC_TCL_DLL 文
件。共享库的版本必须和 Vim 编译使用的 Tcl 版本保持一致。

</section><hr class="doubleline" /><section class=inner>
<h4> vim:tw=78:ts=8:noet:ft=help:norl:</h4></section>
</article>
<footer>
Generated by vim2html
</footer>
</body>
</html>
